x11: Avoid crashes in dnd
authorMatthias Clasen <mclasen@redhat.com>
Sat, 22 Feb 2020 22:44:36 +0000 (17:44 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 23 Feb 2020 00:02:13 +0000 (19:02 -0500)
We were forgetting to clean up the ::xevent signal
handler in some error cases. Move the signal connection
later, when we know the drag is going forward, and
use g_signal_connect_object to make sure the signal
handler is not forgotten.

gdk/x11/gdkdrag-x11.c

index c29304e8182a2b1870f57be1fdcce8b1de5651d1..48ad2b6862cb2780163fb3cc8a33355deba87aa8 100644 (file)
@@ -1714,8 +1714,8 @@ gdk_x11_drag_default_output_handler (GOutputStream   *stream,
 
 static gboolean
 gdk_x11_drag_xevent (GdkDisplay   *display,
-                             const XEvent *xevent,
-                             gpointer      data)
+                     const XEvent *xevent,
+                     gpointer      data)
 {
   GdkDrag *drag = GDK_DRAG (data);
   GdkX11Drag *x11_drag = GDK_X11_DRAG (drag);
@@ -1876,8 +1876,8 @@ gdk_x11_drag_release_selection (GdkDrag *drag)
 }
 
 static void
-gdk_x11_drag_drop_done (GdkDrag *drag,
-                                gboolean        success)
+gdk_x11_drag_drop_done (GdkDrag  *drag,
+                        gboolean  success)
 {
   GdkX11Drag *x11_drag = GDK_X11_DRAG (drag);
   GdkDragAnim *anim;
@@ -2072,8 +2072,6 @@ _gdk_x11_surface_drag_begin (GdkSurface         *surface,
                                    NULL);
   x11_drag = GDK_X11_DRAG (drag);
 
-  g_signal_connect (display, "xevent", G_CALLBACK (gdk_x11_drag_xevent), drag);
-
   precache_target_list (drag);
 
   gdk_device_get_position (device, &px, &py);
@@ -2115,6 +2113,8 @@ _gdk_x11_surface_drag_begin (GdkSurface         *surface,
       return NULL;
     }
 
+  g_signal_connect_object (display, "xevent", G_CALLBACK (gdk_x11_drag_xevent), drag, 0);
+
   return drag;
 }